﻿using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks.Dataflow;

namespace che18
{
    internal class Text15
    {
        static void Main(string[] args)
        {
            Console.WriteLine("循环语句——while");
            //1.作用
            //让顺序执行的代码 可以不停的循环执行某一块代码块的内容
            //条件分支语句 是 让代码产生分支
            //循环语句 是 让代码可以被重复执行

            //2.语法相关
            //bool类型变量 条件运算符 逻辑运算符 
            //while(bool类型的值)
            {
                //当满足条件时 就会执行while语句块中的内容//
                //……
                //……
                //……
                //当代码逻辑执行完 会回到while循环开头
                //再次进行套件判断
            }
            Console.WriteLine("主代码逻辑");
            //死循环
            //不停执行循环中的逻辑 直到死为止
            //死循环只有在目前学习控制台程序时会频繁用到，之后进入到unity时基本不会用
            //1.可能因为内存问题造成程序崩溃闪退
            //2.造成程序卡死
            // while(true)
            //{
            //    Console.WriteLine("我爱初音未来！！");
            //}

            //非死循环
            //计算一个为0的整型变量 让他只能累加一 不停的加到时十为止
            int a = 0;
            //bool类的值 还可以用逻辑运算符 && || ！条件运算符 算术运算结合运算
            while (a < 10)//小于10满足条件会一直循环，直到等于10或大于10不满足条件 停止循环
            {
                a++;
            }
            Console.WriteLine(a);

            //3.嵌套使用
            //不仅可以嵌套 if switch 还可以嵌套 while\
            int b = 0;
            while (a < 10)//算过之后进入嵌套的while循环
            {
                ++a;
                while (b < 10)//在这个循环里b大于等于10之后会跳出b循环，进入a循环
                {
                    ++b;
                }
            }

            int a2 = 0;
            while (a2 < 10)
            {
                ++a2;
                int b2 = 0;//每次从外层循环进来的b2和上一次的b2没有关系（不是一个变量）
                           //注意：没有关系！！！！！！！！！！！！！！！！！！！！
                while (b2 > 10)
                {
                    ++b2;
                }
            }

            //4.循环控制关键词
            //作用：控制循环逻辑的关键词
            //break：跳出循环
            while (true)
            {
                Console.WriteLine("Miku");
                break;//后面不管有什么都不会执行，直接跳出循环
                Console.WriteLine("len");
            }
            Console.WriteLine("hehe");

            int i = 0;
            while (true)
            {
                ++i;
                if (i == 10)
                {
                    break;//打破直接退出循环（退出的是整体的while循环）
                }
            }
            Console.WriteLine(i);
            //contine：回到循环开始 继续执行
            //while (true)
            //{
            //   Console.WriteLine("qian");
            //     continue;
            //     Console.WriteLine("hou");
            //}
            //Console.WriteLine("WAI");

            //打印1~20之间的奇数
            int index = 0;
            while (index < 20)
            {
                ++index;
                if (index % 2 == 0)//奇数不能被二整除
                {
                    continue;
                }
                Console.WriteLine(index);
                continue;
            }

            //注意：break和contine主要是和循环配合使用的 和if语句没关系
            //break在switch中的作用和while循环中的作用有异曲同工之妙
            //           while(true)
            //           {
            //               int l = 1;
            //              switch(l)
            //              {
            //                  default:
            //                     break;
            //              }
            //              Console.WriteLine(l);//会打印无数次1
            //          }

            //作业
            //1.在控制台输出1到100
            int y1 = 0;
            while (y1 < 100)
            {
                ++y1;
                Console.WriteLine(y1);
                continue;
            }

            //2.在控制台输出1到100之间所有整数的和
            int x = 0, y = 1;//y是初始值，x是每次循环加完后的数
            while (y <= 100)//这里是因为y每次加1，一直加到100就会停止循环
            {
                x += y;//相当于x=x+y,就是每次的x是上一次加完y+1后的总和
                y++;//，每次加1，一直到100
            }
            Console.WriteLine(x);//结果5050

            //3.用while和continue实现计算1到100（包含）之间的除了能被7整除之外所有整数的和
            int x2 = 0, y2 = 1;
            while (y2 <= 100)
            {
                if (y2 % 7 == 0)
                {
                    y2++;
                    continue;
                }
                x2 += y2;
                y2++;
            }
            Console.WriteLine(x2);

            //4.提示用户输入一个数，判断该数是否是素数并打印。
            //（素数/质数：只能被1和这个数字本身整除的数字，1不是质数，最小的质数是2）
            Console.WriteLine("数字：");
            try
            {
                int d = Convert.ToInt32(Console.ReadLine());
                int e = 2;
                while (e < d)//2是最小素数，小于它的都不是素数
                {
                    if (e % d == 0)
                    {
                        break;
                    }
                    ++e;
                    continue;
                }
                if (e != d)//判断是否和相等，防止被其他数整除
                {
                    Console.WriteLine("不是素数");
                }
                else
                {
                    Console.WriteLine("是素数");
                }
            }
            catch
            {
                Console.WriteLine("请输入正确数字！");
                //将int b转换的代码要放到 try的代码块里，这样才能被捕捉到（或者把Convert.ToInt32(Console.ReadLine());换成 int.TryParse()）
            }

                //5.要求输入用户名和密码（charlie/123456），用户名或者密码错误，则提示“用户名或密码错误”，直到输入正确为止
            while(false)
            {
                Console.WriteLine("请输入用户名");
                string myName = Console.ReadLine();
                Console.WriteLine("请输入密码");
                string passWord = Console.ReadLine();
                if (myName == "charlie" && passWord == "123456")
                {
                    Console.WriteLine("登录成功");
                }
                else
                {
                    Console.WriteLine("密码错误，请重新输入！");
                }
                continue;
            }

            //6.输入班级人数，然后依次输入学员成绩（需提示当前是第几个学员）
            //计算班级学员的平均成绩和总成绩。
           try
            {
                Console.WriteLine("请输入学生人数：");
                int a1 = int.Parse(Console.ReadLine());
                int b1 = 0;
                int lj = 0;//累加值，每次循环后成绩的累加值
                while (b1 < a1)
                {

                    ++b1;
                    Console.WriteLine("请输入第{0}名学员成绩",b1);//Text8 字符串拼接2
                    int e1 = int.Parse(Console.ReadLine());
                    lj += e1;
                }
                int bb = lj / b1;
                Console.WriteLine("总成绩为{0}，平均成绩为{1}",lj,bb);
            }
            catch
            {
                Console.WriteLine("请输入正确数字：");
            }

            //7.定义一个整形变量sum，然后分别把1~100之间的数字依次累加到sum中，
            //当sum的值大于500的时候，中断操作，并在控制台输出累加到第几个数字就可以使sum大于500
            int sum = 0;
            int sum2= 0;
            while(sum<=500)
            {
                sum2++;
                sum += sum2;
                if (sum>500)
                {
                    Console.WriteLine("到第{0}个数字时就可以使sum大于500",sum2);
                    break;
                }
            }

            //8.假设看唐老师视频的同学有100人，每个月增长20%，
            //请按此速度增长，经历多少个月看唐老师视频的同学能达到1000人？
            int pe = 100;
            int l2= 0;
            while(pe<1000)
            {
                 pe= (int)(pe * 1.2f);//强转，精度低但可以接受（不过我用float也可以，但是人数毕竟不能有小数，还是这样合理）
                 l2++;
                //if (pe==1000)多余，不需要，因为while不满足条件之后会自动终止
                //{
                    //Console.WriteLine("经历{0}个月看视频的人达到1000人", l2);放循环外面就不会循环打印了
                    //break;
                //}
            }
            Console.WriteLine("经历{0}个月看视频的人达到1000人", l2);

            //9.求数列1,1,2,3,5,8,13…的第20位数字是多少？
            //裴波那契数列 从第三个数开始，每个数的值是前两个数的和
            //1+1=2
            //2+3=5
            int n1 = 1, n2 = 1, result = 0;
            index=0;
            while(index<20)
            {
                ++index;
                if(index==1)
                {
                    result = 1;
                    result = n1;
                }
                else if(index==2) 
                {
                    result = 1;
                    result = n2;
                }
                else
                {
                    result = n1 + n2;
                    n1=n2;
                    n2 = result;
                }
            }
            Console.WriteLine("第二十位数字是{0}",result);

            
        }
    }
 }
